<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=\, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let obj = {
            name: 'ikun',
            age: 32,
            hobby: ['讲课', '敲代码', '黑马程序员'],
            class: {
                name: '长沙大前端',
                salary: [18888, 15555, 44444]
            }
        }
        function kaobei(newObj, obj) {
            for (let item in obj) {
                // instanceof作用是判断原型对象中有没有这个方法
                if (obj[item] instanceof Array) {
                    //判断为数组进去判断体
                    //newObj[item] = []这条代码的意思是newObj.hobby=[],也就是给newObj这个方法新增一个对象，
                    //无需声明关键词，换一种写法也就是newObj[hobby]=[],对象的另一种表现形式罢了
                    newObj[item] = []
                    //kaobei(newObj[item], obj[item])这条代码的意思是kaobei(newObj.hobby, obj.hobby)，
                    //把数据重新传入进去判断体条件会一直判断下去，
                    //一直到传进去的 obj.hobby中不再含有引用类型
                    kaobei(newObj[item], obj[item])
                } else if (obj[item] instanceof Object) {
                    //判断为对象进去判断体
                    newObj[item] = {}
                    kaobei(newObj[item], obj[item])
                } else {
                    //进入此判断体则为值类型。非引用类型
                    newObj[item] = obj[item]
                }
            }
        }
        //声明一个新对象开始存储拷贝后的数据
        let newObj = {}
        //开始拷贝
        kaobei(newObj, obj)
        console.log(newObj);
    </script>
</body>

</html>